package c_006;

import java.util.concurrent.TimeUnit;

/**
 * 在下面的代码中,runnning是存在于堆内存的对象中
 * 当线程开始运行时,会把running值从内存中读取到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去
 * 读取堆内存,这样,当主线程修改running的值后,t1线程感知不到,所以不会停止运行
 *
 * 使用volatile,将会强制所有线程都去堆内存中读取runnning的值
 *
 * volatile并不保证多个线程共同修改running变量时所带来不一致问题,也就是说volatile不能代替synchronized
 */
public class T01 {

    volatile boolean running = true;

    void m(){
        System.out.println("m start!");
        while(running){

        }
        System.out.println("m end!");
    }

    public static void main(String[] args) {
        T01 t = new T01();

        new Thread(t::m, "t1").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t.running = false;
    }
}